/*
 * Token.cpp
 *
 *  Created on: 2020年12月18日
 *      Author: san
 */

#include "Token.h"

namespace san {

Token::Token(Token &&t): tok(t.tok)
{
	// 移动构造函数
	switch(t.tok)
	{
	case Token::INT: ival = std::move(t.ival); break;
	case Token::CHAR: cval = std::move(t.cval); break;
	case Token::STR: sval = std::move(t.sval); break;
	case Token::SD: sd = std::move(t.sd); break;
	}
}

Token &Token::operator =(const Token &t)
{
	if (tok == STR && t.tok != STR) sval.~string();
	if (tok == STR && t.tok == STR) sval = t.sval;
	else copyUnion(t);  // 如果t.tok == STR
	tok = t.tok;
	return *this;
}

Token &Token::operator =(const int &i)
{
	if (tok == STR) sval.~string();
	ival = i;
}

Token &Token::operator =(const char &c)
{
	if (tok == CHAR) sval.~string();
	cval = c;
}

Token &Token::operator =(const std::string &s)
{
	sval = s;
}


void Token::copyUnion(const Token &t)
{
	switch(t.tok)
	{
	case Token::INT: ival = t.ival; break;
	case Token::CHAR: cval = t.cval; break;
	case Token::STR: new (&sval) std::string(t.sval); break;  // 如果是string，需要执行构造函数
	case Token::SD: new (&sd) Sales_data(t.sd); break;
	}
}

Token::~Token()
{
	// 析构函数
	if (tok == STR) sval.~string();
	if (tok == SD) sd.~Sales_data();
}


} /* namespace san */
